package it.gestoreContratti.gui.panels;

import it.gestoreContratti.database.DatabaseController;
import it.gestoreContratti.database.exception.DatabaseConnectionException;
import it.gestoreContratti.database.exception.QueryException;
import it.gestoreContratti.entity.Contratto;
import it.gestoreContratti.entity.Specifica;
import it.gestoreContratti.gui.frames.ModifcaSpecificaFrame;
import it.gestoreContratti.gui.frames.ProrogaSpecificaFrame;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.util.Vector;

import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;

public class VisualizzaSpecificheContrattoPanel extends JPanel {

	private static final long serialVersionUID = -6982068801846457997L;
	private DateFormat dateFormat;
	private DatabaseController databaseController;
	private Vector<Specifica> listaSpecifiche;
	private Vector<Specifica> listaSpecificheVisibili;
	private JTextField visualizzazioneTextField;
	private JTable table;
	private JTextField ricercaTextField;	
	private JComboBox ricercaComboBox;
	private JPopupMenu azioni;
	private Contratto contratto;
	private VisualizzaSpecificheContrattoPanel pannello;
	private ContrattiScadenzaPanel pannelloContratti;
	
	
	

	/**
	 * Create the panel.
	 */
	public VisualizzaSpecificheContrattoPanel(ContrattiScadenzaPanel contrattiPanel, Vector<Specifica> specificheContratto) {
		addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				azioni.setVisible(false);
			}
		});		
		GridBagLayout gridBagLayout = new GridBagLayout();
		gridBagLayout.columnWidths = new int[]{80, 105, 131, 0, 0};
		gridBagLayout.rowHeights = new int[]{0, 0, 0, 0};
		gridBagLayout.columnWeights = new double[]{1.0, 1.0, 1.0, 1.0, Double.MIN_VALUE};
		gridBagLayout.rowWeights = new double[]{0.0, 1.0, 0.0, Double.MIN_VALUE};
		setLayout(gridBagLayout);
		
		this.listaSpecifiche = specificheContratto;
		this.pannelloContratti = contrattiPanel;
		this.databaseController = pannelloContratti.getDatabaseController();
		this.contratto = pannelloContratti.getSelectedContratto();
		this.pannello = this;
		
		
		JLabel visualizzazioneLabel = new JLabel("Stai Visualizzando");
		GridBagConstraints gbc_visualizzazioneLabel = new GridBagConstraints();
		gbc_visualizzazioneLabel.anchor = GridBagConstraints.EAST;
		gbc_visualizzazioneLabel.insets = new Insets(0, 0, 5, 5);
		gbc_visualizzazioneLabel.gridx = 0;
		gbc_visualizzazioneLabel.gridy = 0;
		add(visualizzazioneLabel, gbc_visualizzazioneLabel);
		
		visualizzazioneTextField = new JTextField();
		visualizzazioneTextField.setText("SPECIFICE DEL CONTRATTO NUMERO "+contratto.getNumero().toString());
		
		visualizzazioneTextField.setEditable(false);
		GridBagConstraints gbc_visualizzazioneTextField = new GridBagConstraints();
		gbc_visualizzazioneTextField.gridwidth = 3;
		gbc_visualizzazioneTextField.insets = new Insets(0, 0, 5, 5);
		gbc_visualizzazioneTextField.fill = GridBagConstraints.HORIZONTAL;
		gbc_visualizzazioneTextField.gridx = 1;
		gbc_visualizzazioneTextField.gridy = 0;
		add(visualizzazioneTextField, gbc_visualizzazioneTextField);
		visualizzazioneTextField.setColumns(10);
		
		
		JScrollPane scrollPane = new JScrollPane();		
		GridBagConstraints gbc_scrollPane = new GridBagConstraints();
		gbc_scrollPane.fill = GridBagConstraints.BOTH;
		gbc_scrollPane.gridwidth = 4;
		gbc_scrollPane.insets = new Insets(0, 0, 5, 5);
		gbc_scrollPane.gridx = 0;
		gbc_scrollPane.gridy = 1;
		add(scrollPane, gbc_scrollPane);
		
		table = new JTable();
		table.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				if(e.getButton() == MouseEvent.BUTTON3){
					JTable t = (JTable)e.getSource();										
					if(t.getSelectedRow() >=0){
						azioni.setLocation(e.getXOnScreen(), e.getYOnScreen());						
						azioni.setVisible(true);							
						azioni.validate();							
					}
				}
				else{
					azioni.setVisible(false);
				}
			}
			
		});
		table.setModel(new SpecificheTabelModel(listaSpecifiche));
		scrollPane.setViewportView(table);
		
		JLabel ricercaLabel = new JLabel("Ricerca");
		GridBagConstraints gbc_ricercaLabel = new GridBagConstraints();
		gbc_ricercaLabel.anchor = GridBagConstraints.WEST;
		gbc_ricercaLabel.insets = new Insets(0, 0, 0, 5);
		gbc_ricercaLabel.gridx = 0;
		gbc_ricercaLabel.gridy = 2;
		add(ricercaLabel, gbc_ricercaLabel);
		
		ricercaComboBox = new JComboBox();
		ricercaComboBox.setModel(new DefaultComboBoxModel(RicercaSpecificaField.values()));
		GridBagConstraints gbc_ricercaComboBox = new GridBagConstraints();
		gbc_ricercaComboBox.insets = new Insets(0, 0, 0, 5);
		gbc_ricercaComboBox.fill = GridBagConstraints.HORIZONTAL;
		gbc_ricercaComboBox.gridx = 1;
		gbc_ricercaComboBox.gridy = 2;
		add(ricercaComboBox, gbc_ricercaComboBox);
		
		ricercaTextField = new JTextField();
		GridBagConstraints gbc_ricercaTextField = new GridBagConstraints();
		gbc_ricercaTextField.insets = new Insets(0, 0, 0, 5);
		gbc_ricercaTextField.fill = GridBagConstraints.HORIZONTAL;
		gbc_ricercaTextField.gridx = 2;
		gbc_ricercaTextField.gridy = 2;
		add(ricercaTextField, gbc_ricercaTextField);
		ricercaTextField.setColumns(10);
		
		JButton ricercaButton = new JButton("Ricerca");
		ricercaButton.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				RicercaSpecificaField selected = (RicercaSpecificaField) ricercaComboBox.getSelectedItem();
				try{
					switch (selected) {
					case NUMERO:
						if(ricercaTextField.getText().length() == 0){
							JOptionPane.showMessageDialog(null, "Il campo di ricerca non deve essere vuoto", "", JOptionPane.WARNING_MESSAGE);								
						}else if(ricercaTextField.getText().length() > 15){
							JOptionPane.showMessageDialog(null, "Il campo di ricerca deve essere lungo massimo 15 caratteri", "", JOptionPane.WARNING_MESSAGE);
							ricercaTextField.setText("");
							ricercaTextField.validate();
						}else{
							BigDecimal numeroSearch = new BigDecimal(ricercaTextField.getText());
							listaSpecificheVisibili = new Vector<Specifica>();
							for(int i=0;i<listaSpecifiche.size();i++){
								if(listaSpecifiche.get(i).getNumero().compareTo(numeroSearch) == 0){
									listaSpecificheVisibili.add(listaSpecifiche.get(i));
								}
							}							
							table.setModel(new SpecificheTabelModel(listaSpecificheVisibili));					
							table.validate();								
						}
						break;					
					case DATA_INIZIO:
						if(ricercaTextField.getText().length() == 0){
							JOptionPane.showMessageDialog(null, "Il campo di ricerca non deve essere vuoto", "", JOptionPane.WARNING_MESSAGE);								
						}else if(ricercaTextField.getText().length() != 10){
							JOptionPane.showMessageDialog(null, "Il campo di ricerca non deve essere una data nel formato GG/MM/AAAA", "", JOptionPane.WARNING_MESSAGE);
							ricercaTextField.setText("");
							ricercaTextField.validate();
						}else{								
							listaSpecificheVisibili = new Vector<Specifica>();
							for(int i=0;i<listaSpecifiche.size();i++){
								if(dateFormat.format(listaSpecifiche.get(i).getDataInizio()).equals(ricercaTextField.getText())){
									listaSpecificheVisibili.add(listaSpecifiche.get(i));
								}
							}							
							table.setModel(new SpecificheTabelModel(listaSpecificheVisibili));					
							table.validate();								
						}
						break;
					case DATA_SCADENZA:							
						if(ricercaTextField.getText().length() == 0){
							JOptionPane.showMessageDialog(null, "Il campo di ricerca non deve essere vuoto", "", JOptionPane.WARNING_MESSAGE);								
						}else if(ricercaTextField.getText().length() != 10){
							JOptionPane.showMessageDialog(null, "Il campo di ricerca non deve essere una data nel formato GG/MM/AAAA", "", JOptionPane.WARNING_MESSAGE);
							ricercaTextField.setText("");
							ricercaTextField.validate();
						}else{								
							listaSpecificheVisibili = new Vector<Specifica>();
							for(int i=0;i<listaSpecifiche.size();i++){
								if(dateFormat.format(listaSpecifiche.get(i).getDataScadenza()).equals(ricercaTextField.getText())){
									listaSpecificheVisibili.add(listaSpecifiche.get(i));
								}
							}							
							table.setModel(new SpecificheTabelModel(listaSpecificheVisibili));					
							table.validate();								
						}
						break;
					case TERMINE_CONSEGNA:
						if(ricercaTextField.getText().length() == 0){
							JOptionPane.showMessageDialog(null, "Il campo di ricerca non deve essere vuoto", "", JOptionPane.WARNING_MESSAGE);								
						}else if(ricercaTextField.getText().length() > 4){
							JOptionPane.showMessageDialog(null, "Il campo di ricerca deve essere lungo massimo 4 caratteri", "", JOptionPane.WARNING_MESSAGE);
							ricercaTextField.setText("");
							ricercaTextField.validate();
						}else{
							BigDecimal termineConsegnaSearch = new BigDecimal(ricercaTextField.getText());
							listaSpecificheVisibili = new Vector<Specifica>();
							for(int i=0;i<listaSpecifiche.size();i++){
								if(listaSpecifiche.get(i).getTermineConsegna().compareTo(termineConsegnaSearch) == 0){
									listaSpecificheVisibili.add(listaSpecifiche.get(i));
								}
							}							
							table.setModel(new SpecificheTabelModel(listaSpecificheVisibili));					
							table.validate();								
						}
						break;		
					case IMPORTO:							
						if(ricercaTextField.getText().length() == 0){
							JOptionPane.showMessageDialog(null, "Il campo di ricerca non deve essere vuoto", "", JOptionPane.WARNING_MESSAGE);								
						}else if(ricercaTextField.getText().length() > 15){
							JOptionPane.showMessageDialog(null, "Il campo di ricerca deve essere lungo massimo 15 caratteri", "", JOptionPane.WARNING_MESSAGE);
							ricercaTextField.setText("");
							ricercaTextField.validate();
						}else{
							BigDecimal importoSearch = new BigDecimal(ricercaTextField.getText());
							listaSpecificheVisibili = new Vector<Specifica>();
							for(int i=0;i<listaSpecifiche.size();i++){
								if(listaSpecifiche.get(i).getImporto().compareTo(importoSearch) == 0){
									listaSpecificheVisibili.add(listaSpecifiche.get(i));
								}
							}							
							table.setModel(new SpecificheTabelModel(listaSpecificheVisibili));					
							table.validate();								
						}
						break;
					case NUMERO_CONTRATTO:							
						if(ricercaTextField.getText().length() == 0){
							JOptionPane.showMessageDialog(null, "Il campo di ricerca non deve essere vuoto", "", JOptionPane.WARNING_MESSAGE);								
						}else if(ricercaTextField.getText().length() > 15){
							JOptionPane.showMessageDialog(null, "Il campo di ricerca deve essere lungo massimo 15 caratteri", "", JOptionPane.WARNING_MESSAGE);
							ricercaTextField.setText("");
							ricercaTextField.validate();
						}else{
							BigDecimal numeroContrattoSearch = new BigDecimal(ricercaTextField.getText());
							listaSpecificheVisibili = new Vector<Specifica>();
							for(int i=0;i<listaSpecifiche.size();i++){
								if(listaSpecifiche.get(i).getNumeroContratto().compareTo(numeroContrattoSearch) == 0){
									listaSpecificheVisibili.add(listaSpecifiche.get(i));
								}
							}							
							table.setModel(new SpecificheTabelModel(listaSpecificheVisibili));					
							table.validate();								
						}
						break;
					default:
						break;
					}
				}catch (NumberFormatException ex) {
					JOptionPane.showMessageDialog(null, "Il campo di ricerca deve essere un numero", "", JOptionPane.WARNING_MESSAGE);
					ricercaTextField.setText("");
					ricercaTextField.validate();
				}
				
			}			
		});
		GridBagConstraints gbc_ricercaButton = new GridBagConstraints();
		gbc_ricercaButton.gridx = 3;
		gbc_ricercaButton.gridy = 2;
		add(ricercaButton, gbc_ricercaButton);
		
		azioni = new JPopupMenu("AZIONI");		
		JMenuItem modificaSpecificaMenuItem = new JMenuItem("Modifica");
		modificaSpecificaMenuItem.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseReleased(MouseEvent arg0) {
				if(table.getSelectedRow() >=0){
					Specifica s = listaSpecifiche.get(table.getSelectedRow());
					ModifcaSpecificaFrame modifcaSpecificaFrame = new ModifcaSpecificaFrame(pannello, s);
					modifcaSpecificaFrame.setVisible(true);
					azioni.setVisible(false);
					
				}				
			}
		});
		JMenuItem prorogaSpecificaMenuItem = new JMenuItem("Proroga");
		prorogaSpecificaMenuItem.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseReleased(MouseEvent arg0) {
				if(table.getSelectedRow() >=0){
					Specifica s = listaSpecifiche.get(table.getSelectedRow());
					ProrogaSpecificaFrame prorogaSpecificaFrame = new ProrogaSpecificaFrame(pannello, s);
					prorogaSpecificaFrame.setVisible(true);
					azioni.setVisible(false);
				}				
			}
		});
		JMenuItem eliminaSpecificaMenuItem = new JMenuItem("Elimina");
		eliminaSpecificaMenuItem.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseReleased(MouseEvent arg0) {
				if(table.getSelectedRow() >=0){
					int conferma = JOptionPane.showConfirmDialog(null, "Eliminare definitivamente la specifica?", "", JOptionPane.YES_NO_OPTION);
					if(conferma == JOptionPane.YES_OPTION){
						Specifica s = listaSpecifiche.get(table.getSelectedRow());
						try{
							azioni.setVisible(false);
							databaseController.eliminaSpecifica(s);
							JOptionPane.showMessageDialog(null, "Specifica eliminata correttamente", "", JOptionPane.INFORMATION_MESSAGE);
							refresh();
						}catch (DatabaseConnectionException e) {
							JOptionPane.showMessageDialog(null, e.getMessage(), "", JOptionPane.ERROR_MESSAGE);
						}catch (QueryException e) {
							JOptionPane.showMessageDialog(null, e.getMessage(), "", JOptionPane.ERROR_MESSAGE);
						}
						
					}
					
					
				}				
			}
		});
		azioni.add(modificaSpecificaMenuItem);
		azioni.add(prorogaSpecificaMenuItem);
		azioni.add(eliminaSpecificaMenuItem);
	}
	
	public void refresh(){
		try {
			listaSpecifiche = databaseController.selectSpecificheContratto(contratto);
			table.setModel(new SpecificheTabelModel(listaSpecifiche));
			table.validate();
		} catch (DatabaseConnectionException e) {
			JOptionPane.showMessageDialog(null, "Impossibile aggiornare il pannello delle specifiche", "", JOptionPane.ERROR_MESSAGE);
		} catch (QueryException e) {
			JOptionPane.showMessageDialog(null, "Impossibile aggiornare il pannello delle specifiche", "", JOptionPane.ERROR_MESSAGE);
		}
		
	}
	
	public DatabaseController getDatabaseController(){
		return databaseController;
	}
	
	public Contratto getContratto(){
		return contratto;
	}
	
	public JPopupMenu getAzioni(){
		return azioni;
	}

}
